home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1995 April / Internet Tools.iso / osi / isode / dosisode / DOSISODE80.ZIP / ISODE8.WRK / UTILS / DJTARXX.C < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-27  |  5.2 KB  |  227 lines

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <sys/stat.h>
  4. #include <string.h>
  5. #include <errno.h>
  6.  
  7. FILE *change_file;
  8.  
  9. main(int argc, char **argv)
  10. {
  11.   int i;
  12.   read_convert(); /*pkay mod*/
  13.   for (i=1; i < argc; i++)
  14.     tarread(argv[i]);
  15.   change_file = fopen("/tarchange.lst", "w");
  16.   dump_changes();
  17.   fclose(change_file);
  18. }
  19.  
  20. /*------------------------------------------------------------------------*/
  21.  
  22. typedef struct CHANGE {
  23.   struct CHANGE *next;
  24.   char *old;
  25.   char *new;
  26.   int isdir; /* 0=file, 1=dir, 2=skip */
  27. } CHANGE;
  28.  
  29. CHANGE *change_root = 0;
  30.  
  31. dump_changes()
  32. {
  33.   CHANGE *c;
  34.   for (c=change_root; c; c=c->next)
  35.     fprintf(change_file, "%s -> %s\n", c->old, c->new);
  36. }
  37.  
  38. int change(char *fname, char *problem, int isadir)
  39. {
  40.   CHANGE *ch;
  41.   char new[200];
  42.   char *pos;
  43.  
  44.   for (ch=change_root; ch; ch = ch->next)
  45.     if ((strncmp(fname, ch->old, strlen(ch->old)) == 0) && ch->isdir)
  46.     {
  47.       if (ch->isdir == 2)
  48.       {
  49.         printf("  [ skipping %s ]\n", fname);
  50.         return 0;
  51.       }
  52. /*      printf("  [ changing %s to ", fname); */
  53.       sprintf(new, "%s%s", ch->new, fname+strlen(ch->old));
  54.       strcpy(fname, new);
  55. /*      printf("%s ]\n", fname); */
  56.       return 1;
  57.     }
  58.   printf("  %s %s\n  new name : ", problem, fname);
  59.   gets(new);
  60.   if ((strcmp(new, "") == 0) && (isadir == 2))
  61.     return 0;
  62.   if (isadir) isadir=1;
  63.   ch = (CHANGE *)malloc(sizeof(CHANGE));
  64.   ch->next = change_root;
  65.   change_root = ch;
  66.   ch->old = strdup(fname);
  67.   pos = strrchr(fname, '/');
  68.   if (pos && (strchr(new, '/') == 0))
  69.   {
  70.     ch->new = (char *)malloc(strlen(new) + (pos-fname) + 2);
  71.     *pos = 0;
  72.     sprintf(ch->new, "%s/%s", fname, new);
  73.   }
  74.   else
  75.     ch->new = strdup(new);
  76.   ch->isdir = isadir;
  77.   strcpy(fname, ch->new);
  78.   if (new[0] == 0)
  79.   {
  80.     ch->isdir = 2;
  81.     return 0;
  82.   }
  83.   return 1;
  84. }
  85.  
  86. /*------------------------------------------------------------------------*/
  87.  
  88. typedef struct {
  89.   char name[100];
  90.   char operm[8];
  91.   char ouid[8];
  92.   char ogid[8];
  93. /*  char osize[11];*/
  94.   char osize[12];
  95.   char otime[12];
  96.   char ocsum[8];
  97.   char flags[1];
  98.   char linkname[100];
  99.   char filler[255];
  100. } TARREC;
  101.  
  102. char buf[512];
  103.  
  104. tarread(char *fname)
  105. {
  106.   TARREC header;
  107.   int f, r;
  108.   long perm, uid, gid, size, time, csum;
  109.   int dsize;
  110.   f = open(fname, O_RDONLY|O_BINARY);
  111.  
  112.   while (1)
  113.   {
  114.     if (read(f, &header, 512) < sizeof(header))
  115.       break;
  116.     if (header.name[0] == 0)
  117.       break;
  118.     sscanf(header.operm, "%lo", &perm);
  119.     sscanf(header.ouid, "%lo", &uid);
  120.     sscanf(header.ogid, "%lo", &gid);
  121.     sscanf(header.osize, "%lo", &size);
  122.     sscanf(header.otime, "%lo", &time);
  123.     printf("%6lo %02x %12ld %s\n", perm, header.flags[0], size, header.name);
  124.     if (header.flags[0] != 0) {
  125.     printf("Linked file skipped\n");
  126.     continue;
  127.     }
  128.     if (header.name[strlen(header.name)-1] == '/')
  129.     {
  130.       header.name[strlen(header.name)-1] = 0;
  131.       do {
  132.         printf("Making directory %s\n", header.name);
  133.         convert_file(header.name);
  134.         r = mkdir(header.name,0);
  135.     break; /* we don't want to know about any errors!*/
  136.         if (r && (errno==EACCES))
  137.         {
  138.           change(header.name, "Duplicate directory name", 2);
  139.           break;
  140.         }
  141.         if (r)
  142.           r = change(header.name, "Unable to create directory", 1);
  143.       } while (r);
  144.     }
  145.     else
  146.     {
  147.     open_file:
  148.       convert_file(header.name);
  149.       r = open(header.name, O_WRONLY|O_BINARY|O_CREAT|O_EXCL, S_IWRITE|S_IREAD);
  150.       if (r < 0)
  151. /*        if (change(header.name, "Cannot exclusively open file", 0))
  152.           goto open_file;
  153.         else  - we don't want to know about any errors! - ignore them*/
  154.         {
  155.           lseek(f, (size+511) & ~511, 1);
  156.         }
  157.       else
  158.       {
  159.         while (size)
  160.         {
  161.           if (size < 512)
  162.             dsize = size;
  163.           else
  164.             dsize = 512;
  165.           read(f, buf, 512);
  166.           if (write(r, buf, dsize) < dsize)
  167.           {
  168.             printf("Out of disk space\n");
  169.             exit(1);
  170.           }
  171.           size -= dsize;
  172.         }
  173.         close(r);
  174.       }
  175.     }
  176.   }
  177.   close(f);
  178. }
  179. char *of[500], *nf[500];
  180. int fl = 0;
  181. read_convert()
  182. {
  183.   FILE *inp;
  184.   char buffer[1024], *p, *q;
  185.   bzero(buffer,1024);
  186.   p = getenv("ISODEI");
  187.   if (p) strcpy(buffer, p);
  188.   strcat(buffer,"/utils/convert.lst");
  189.   if ((inp = fopen(buffer,"r")) == NULL) return;
  190.   while (fgets(buffer, 1024, inp) != NULL) {
  191.     p = strtok(buffer,"\t");
  192.     if (p == NULL) break;
  193.     of[fl] = malloc(strlen(p)+1);
  194.     strcpy(of[fl], p);
  195.     p = strtok(NULL, "\t\n");
  196.     if (p == NULL) {
  197.       of[fl] = NULL;
  198.       break;
  199.     }
  200.     nf[fl] = malloc(strlen(p)+strlen(of[fl]));
  201.     strcpy(nf[fl], of[fl]);
  202.     q = strrchr(nf[fl],'/');
  203.     *(q+1) = '\0';
  204.     strcat(nf[fl],p);
  205.     fl++;
  206.   }
  207.   fclose(inp);
  208. }
  209. convert_file(s)
  210. char *s;
  211. {
  212.   int i;
  213.   char *p;
  214.  
  215.   p = s;
  216.   while ((p = strchr(p, '=')) != NULL) *p = '_';
  217.   p = s;
  218.   while ((p = strchr(p, ' ')) != NULL) *p = '_';
  219.   for (i=0; i<fl; i++) {
  220.     if (strcmp(s, of[i]) == 0) {
  221.       printf("%s converted to %s\n",s,nf[i]);
  222.       strcpy(s, nf[i]);
  223.       return;
  224.     }
  225.   }
  226. }
  227.